/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.Neumaticos;
import com.camachosanchez.gui.Principal;
import com.camachosanchez.util.Constantes;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 *
 * @author ZULLY
 */
public class ReporteNeumaticosXCategoria {

    private EntityManagerFactory emf;
    private EntityManager em;
    private SimpleDateFormat formatoFechaEnNombre;
    
    public ReporteNeumaticosXCategoria(){
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
        formatoFechaEnNombre = new SimpleDateFormat("dd-MM-yyyy");
    }
    
    public void generarReporte(Neumaticos neumatico, List<Integer> categorias, Date fechaDesde, Date fechaHasta){
        Document document = new Document(PageSize.A4.rotate(), 30, 30, 20, 20);
        try {
            String nombrePdf = "reportes/neumaticosXUbicacion" + formatoFechaEnNombre.format(new Date()) + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            PdfPTable tablaC = new PdfPTable(1);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(90);
            PdfPCell celda = new PdfPCell(new Phrase("NEUMÁTICOS POR UBICACIÓN", FontFactory.getFont(BaseFont.HELVETICA, 12, Font.NORMAL, BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorder(Rectangle.NO_BORDER);
            tablaC.addCell(celda);
            document.add(tablaC);
            
            float[] anchoColsInf = {1.5f, 2.3f, 2.0f, 2.5f, 0.5f, 1.2f, 1.3f, 1f, 2f, 1.4f, 1.4f, 1.4f};
            PdfPTable tablaInf = new PdfPTable(anchoColsInf);
            tablaInf.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaInf.setSpacingBefore(10f);
            tablaInf.setWidthPercentage(90);
            
            tablaInf.addCell(ReportUtil.getCelda("Código", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Marca", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Medida", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Tipo Piso", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("R", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Altura", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Estado", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Km Total", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Ubicación", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Código V.", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Placa V.", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            tablaInf.addCell(ReportUtil.getCelda("Pos en V.", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 1));
            
            List<Neumaticos> lista = getListaNeumaticos(neumatico, categorias, fechaDesde, fechaHasta);
            for(Neumaticos item : lista){
                String marca = (item.getIdMarca() == null) ? "" : item.getIdMarca().getNombre();
                String medida = (item.getIdModelo() == null) ? "" : item.getIdModelo().getMedida();
                String tipoPiso = (item.getTipoPiso() == null) ? "" : item.getTipoPiso().getNombre();
                Double alturaMinima = item.getLabradoCentral();
                if(alturaMinima != null && alturaMinima < item.getLabradoExterior()){
                    alturaMinima = item.getLabradoExterior();
                }
                if(alturaMinima != null && alturaMinima < item.getLabradoInterno()){
                    alturaMinima = item.getLabradoInterno();
                }
                alturaMinima = (alturaMinima != null && alturaMinima == 0) ? null : alturaMinima;
                String estado = item.getIdEstadoMedicion().getNombre();
                String ubicacion = item.getIdCategoria().getNombre();
                String codigoV = "", placaV = "", posV = "";
                if(item.getIdCategoria().getId().equals(Constantes.CATEGORIA_MONTADO)){//Si está montado
                    if(item.getCodigoVehiculo() != null) {
                        codigoV = item.getCodigoVehiculo();
                    }
                    if(item.getInfMontaje() != null) {
                        placaV = item.getInfMontaje();
                    }
                    if(item.getPosicion() != null) {
                        posV = (item.getPosicion() <= 0) ? "R" : item.getPosicion() + "";
                    }
                }
                
                tablaInf.addCell(ReportUtil.getCelda(item.getCodigo(), 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(marca, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(medida, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(tipoPiso, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(item.getNumRenovaciones() + "", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(((alturaMinima == null) ? "" : alturaMinima + ""), 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(estado, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(item.getKmTotal() + "", 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(ubicacion, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(codigoV, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(placaV, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
                tablaInf.addCell(ReportUtil.getCelda(posV, 1, 1, BaseColor.WHITE, 1, 0.5f, 10, 0));
            }
            document.add(tablaInf);
            document.close();
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(Principal.getInstance(), ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    private List<Neumaticos> getListaNeumaticos(Neumaticos neumatico, List<Integer> categorias, Date fechaDesde, Date fechaHasta){
        java.sql.Date sqlFechaIni, sqlFechaFin;
        String sql = "SELECT N FROM Neumaticos N WHERE";
        if(neumatico.getIdMarca() != null){
            sql += " N.idMarca.id = :idMarca AND";
        }
        if(neumatico.getIdAlmacen() != null){
            sql += " N.idAlmacen.id = :idAlmacen AND";
        }
        if(neumatico.getTipoPiso() != null){
            sql += " N.tipoPiso.id = :idTipoPiso AND";
        }
        if(neumatico.getIdModelo() != null){
            sql += " N.idModelo.id = :idModelo AND";
        }
        if(neumatico.getIdEstado() != null){
            sql += " N.idEstado.id = :idEstado AND";
        }
        if(neumatico.getIdEstadoMedicion() !=null){
            sql += "N.idEstadoMedicion.id = :idEstadoM AND";
        }
        if(fechaDesde != null){
            sql += " N.fechaCompra >= :fechaIni AND N.fechaCompra <= :fechaFin AND";
        }
        if(!categorias.isEmpty()){
            sql += " N.idCategoria.id IN (";
            for(Integer item : categorias){
                sql += item + ",";
            }
            sql = sql.substring(0, sql.length()-1);
            sql += ") AND";
        }
        sql += " N.estado = 1 ORDER BY N.codigo";
        Query q = em.createQuery(sql);
        if(neumatico.getIdMarca() != null){
            q.setParameter("idMarca", neumatico.getIdMarca().getId());
        }
        if(neumatico.getIdAlmacen() != null){
            q.setParameter("idAlmacen", neumatico.getIdAlmacen().getId());
        }
        if(neumatico.getTipoPiso() != null){
            q.setParameter("idTipoPiso", neumatico.getTipoPiso().getId());
        }
        if(neumatico.getIdModelo() != null){
            q.setParameter("idModelo", neumatico.getIdModelo().getId());
        }
        if(neumatico.getIdEstado() != null){
            q.setParameter("idEstado", neumatico.getIdEstado().getId());
        }
        if(neumatico.getIdEstadoMedicion() !=null){
            q.setParameter("idEstadoM", neumatico.getIdEstadoMedicion().getId());
        }
        if(fechaDesde != null){
            sqlFechaIni = new java.sql.Date(fechaDesde.getTime());
            sqlFechaFin = new java.sql.Date(fechaHasta.getTime());
            q.setParameter("fechaIni", sqlFechaIni);
            q.setParameter("fechaFin", sqlFechaFin);
        }
//        if(!categorias.isEmpty()){
//            q.setParameter("lstCategorias", categorias);
//        }
        return q.getResultList();
    }
}
